package cn.anecansaitin.firecrafting.api.common.crafting;

import cn.anecansaitin.firecrafting.api.client.crafting.IJEIRecipeRender;
import cn.anecansaitin.firecrafting.api.common.block.entity.IFireInterfaceEntity;
import cn.anecansaitin.firecrafting.api.common.state.enums.RecipeActionResult;
import cn.anecansaitin.firecrafting.common.crafting.FireEnergyRecipe;
import cn.anecansaitin.firecrafting.common.crafting.ModRecipeTypes;
import net.minecraft.core.BlockPos;
import net.minecraft.core.NonNullList;
import net.minecraft.world.Container;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import org.jetbrains.annotations.NotNull;

import java.util.List;

/**
 * 烈焰配方的基础接口<br/>
 * 实现该接口添加拓展配方类型
 *
 * @see FireEnergyRecipe
 */
public interface IFireRecipe extends Recipe<Container> {
    /**
     * 烈焰配方的类型ID，不能修改
     */
    String TYPE_ID = "fire_crafting";

    /**
     * 适用于世界内合成（把物品丢入火中）的配方检测
     *
     * @param stacks 火焰中保存的物品
     * @param pos    火焰坐标
     * @param world  火焰所处世界
     * @return 配方检测结果
     */
    default boolean match(List<ItemStack> stacks, BlockPos pos, Level world) {
        return match(stacks, world.getBlockState(pos.below()).getBlock());
    }

    /**
     * 适用于通过火焰交互方块的配方检测
     * @param stacks 用于合成的物品
     * @param fire 用于合成的火焰
     * @return 配方检测结果
     */
    boolean match(List<ItemStack> stacks, Block fire);

    /**
     * 不进行配方检测直接执行
     * @param pos 火焰所在坐标
     * @param world 火焰所处世界
     * @return 执行结果
     */
    default RecipeActionResult doAction(BlockPos pos, Level world) {
        return RecipeActionResult.SUCCESS;
    };

    /**
     * 在配方正确时对世界进行一系列行为，如放置方块，生成物品。<br/>
     * 行为进行成功返回true。
     * @param stacks 用于合成产物的物品
     * @param pos 火焰所在坐标
     * @param world 火焰所处世界
     * @return 执行结果
     */
    boolean doAction(List<ItemStack> stacks, BlockPos pos, Level world);

    /**
     * 通过火焰交互方块生成产物
     * @return -1 配方检测不通过  0 配方检测通过，但无法生成产物  1 产物生成成功
     */
    default int doAction(IFireInterfaceEntity fireInterface) {
        return -1;
    }

    /**
     * 检测火焰是否符合（适用于世界合成）
     * @param pos 火焰坐标
     * @param world 火焰所处世界
     * @return 检测结果
     */
    default boolean matchFire(BlockPos pos, Level world){
        return matchFire(world.getBlockState(pos).getBlock());
    }

    /**
     * 检测火焰是否符合（适用于火焰接口合成）
     * @param fire 火焰方块
     * @return 检测结果
     */
    boolean matchFire(Block fire);

    /**
     * @return 能用于配方合成的火焰
     */
    List<Block> getFires();

    /**
     * 处理JEI中渲染配方展示
     */
    default IJEIRecipeRender getRender() {
        return new IJEIRecipeRender() {
        };
    }

    //不使用以下方法并以为其设置默认值
    //配方所属配方类型，统一返回FIRE_TYPE
    @Override
    default @NotNull RecipeType<?> getType() {
        return ModRecipeTypes.FIRE_TYPE.get();
    }

    //合成后剩余物品（牛奶桶合成蛋糕后返还桶）
    @Override
    default @NotNull NonNullList<ItemStack> getRemainingItems(@NotNull Container pContainer) {
        return NonNullList.create();
    }

    //是否会出现在合成书中，为true不出现
    @Override
    default boolean isSpecial() {
        return true;
    }

    //是否能够在给定格子范围内合成（工作台3*3，玩家背包2*2）
    @Override
    default boolean canCraftInDimensions(int pWidth, int pHeight) {
        return true;
    }

    //获取配方合成产物，通常用于合成书的展示
    @Override
    default @NotNull ItemStack getResultItem() {
        return ItemStack.EMPTY;
    }

    //检测输入物品是否能制作产物
    @Override
    default boolean matches(@NotNull Container pContainer, @NotNull Level pLevel) {
        return false;
    }

    //返回配方的产物
    @Override
    default @NotNull ItemStack assemble(@NotNull Container pContainer) {
        return ItemStack.EMPTY;
    }
}
